package DFA

type NodeStack struct {
	sli  []NFA
	STop int
}

func CreateStack() *NodeStack {
	var s = NodeStack{}
	s.sli = make([]NFA, 100)
	s.STop = -1
	return &s
}
func (s *NodeStack) Push(n NFA) {
	if s.STop == len(s.sli)-1 {
		s.sli = append(s.sli, n)
		s.STop++
		return
	}
	s.STop++
	s.sli[s.STop] = n
}

func (s *NodeStack) Pop() NFA {
	if s.STop == -1 {
		panic("empty")
	}
	tem := s.sli[s.STop]
	s.STop--
	return tem
}

type flagStack struct {
	sli  []byte
	sTop int
}

func CreateFlagStack() *flagStack {
	var fs = flagStack{}
	fs.sli = make([]byte, 100)
	fs.sTop = -1
	return &fs
}
func (s *flagStack) Push(c byte) {
	if s.sTop == len(s.sli)-1 {
		s.sli = append(s.sli, c)
		s.sTop++
		return
	}
	s.sTop++
	s.sli[s.sTop] = c
}

func (s *flagStack) Pop() byte {
	if s.sTop == -1 {
		panic("empty")
	}
	t := s.sli[s.sTop]
	s.sTop--
	return t
}
func (s flagStack) Peek() byte {
	return s.sli[s.sTop]
}

func (s flagStack) IsEmpty() bool {
	return s.sTop == -1
}
